【MySQL】サブクエリ(WHERE) - SELECT結果をWHEREに使用する
MySQLのサブクエリについて解説します。
検証環境
サブクエリ
サブクエリは“別のクエリ内のSELECT文”です。
SELECT文やUPDATE文、DELETE文などのWHERE句と併せてサブクエリを使います。
基本構文
クエリ ( SELECT文 )
サンプル
サブクエリはそのSELECT文による『取得レコードの数』などによって構文が変わります。
次のshops
テーブルとitems
テーブルを使って、サンプルを示します。
mysql> SELECT * FROM shops;
+----+--------------+------+
| id | name | code |
+----+--------------+------+
| 1 | Fruits Shop | S001 |
| 2 | Food Shop | S002 |
| 3 | Dessert Shop | S003 |
+----+--------------+------+
3 rows in set (0.00 sec)
mysql> SELECT * FROM items;
+----+-----------+-------+-------+------+
| id | name | price | stock | code |
+----+-----------+-------+-------+------+
| 1 | Apple | 200 | 10 | S001 |
| 2 | Orange | 150 | 3 | S001 |
| 3 | Pineapple | 1100 | 3 | S002 |
| 4 | Grapes | 3500 | 1 | S002 |
+----+-----------+-------+-------+------+
4 rows in set (0.01 sec)
1レコードのみ
サブクエリの取得レコードが1つのみの場合のサンプルです。
mysql> SELECT * FROM shops
___ih_hl_start
-> WHERE code = ( SELECT code FROM items where id = 1 );
___ih_hl_end
+----+-------------+------+
| id | name | code |
+----+-------------+------+
| 1 | Fruits Shop | S001 |
+----+-------------+------+
1 row in set (0.00 sec)
2行目の( SELECT code FROM items where id = 1 )
がサブクエリです。
WHERE句の比較値にサブクエリの結果を使用しています。
なお、サブクエリの取得レコードが複数個ある場合、この構文ではエラーが発生します。
mysql> SELECT * FROM shops
-> WHERE code = ( SELECT code FROM items where id IN ( 1, 3 ) );
ERROR 1242 (21000): Subquery returns more than 1 row
ANY: 複数レコード(いずれかが条件を満たす)
サブクエリの取得レコードが複数個あり、そのいずれかのデータが条件を満たすことを指定する場合はANY
を使用します。
mysql> SELECT * FROM shops
___ih_hl_start
-> WHERE code = ANY ( SELECT code FROM items where id IN ( 1, 3 ) );
___ih_hl_end
+----+-------------+------+
| id | name | code |
+----+-------------+------+
| 1 | Fruits Shop | S001 |
| 2 | Food Shop | S002 |
+----+-------------+------+
2 rows in set (0.00 sec)
2行目のようにサブクエリ(( SELECT code FROM items where id IN ( 1, 3 ) )
)の前にANY
を記述します。
ALL: 複数レコード(全てが条件を満たす)
サブクエリの取得レコードが複数個あり、その全てのデータが条件を満たすことを指定する場合はALL
を使用します。
mysql> SELECT * FROM shops
___ih_hl_start
-> WHERE code <> ALL ( SELECT code FROM items where id IN ( 1, 3 ) );
___ih_hl_end
+----+--------------+------+
| id | name | code |
+----+--------------+------+
| 3 | Dessert Shop | S003 |
+----+--------------+------+
1 row in set (0.00 sec)
2行目のようにサブクエリ(( SELECT code FROM items where id IN ( 1, 3 ) )
)の前にALL
を記述します。